ORM
作者資料
珉萁的Demo
ORM
Object Relational Mapping
什麼是 ORM?
中文為物件關聯對映。
ORM 在網站開發結構中,是在『資料庫』和『 Model 資料容器 』兩者之間,
簡單來說,它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,
因為 ORM 的一個特性為: 透過程式語言(Ruby, Java),去操作資料庫語言( SQL )。
使用 ORM 的好處與壞處
好處
安全性 終於不會再被 SQL Injection 啦~
但隨之而來的是 ORM Injection簡單舒適好維護 脫離 SQL 語法,每天舒適好開心。
通用性 一套通吃全部,
只要驅動有包好。
ORM Injection
Orders.find_all "customer_id = '#{@params['order_date']}'"
塞入 OR 1--
就可以開心注入了
通用性
ORM
Tests = Test.findAll(limit: 10, where: {id: 12});
SQL
-- MySQL
SELECT * FROM TestTable WHERE id=12 LIMIT 10
-- MsSQL
SELECT TOP 10 * FROM TestTable WHERE id=12
壞處
效能殺手 須將 SQL 內容物件化,資料量越大越消耗記憶體。
複雜查詢較無法套用 多表 join,複雜關連與條件。 EX: 校務系統
資料庫專屬的特殊語法,ORM若無實作則會無法使用。
複雜查詢
User.where("age between ? and ?", 10, 30)
專屬語法
尤其日期處理部分,各家資料庫實作方式皆不相同。
--- sqlite3
SELECT datetime('now', 'localtime');
SELECT strftime('%s', 'now');
--- MySQL
SELECT DATE('2003-12-31 01:02:03');
ORM 提供哪些功能?
常見有這 4 項
- Model
- Migration
- Seed
- Factory
Model
代表資料庫中的一個表格,包含表格中的欄位以及相應的資料型別。
Migration
資料庫遷移,描述了一個資料庫內的資料表的生成歷程。 可以想像成是一個資料庫版本的 git。
Seed
種子資料,可以放一些希望資料庫初始化時能夠一起放進去的資料。 EX: 預設管理員帳號
Factory
資料工廠,可以套用一些規則,幫你產出數數筆按照規則的資料。 這在做測試時非常有用~
來點實作一下
我們拿 python 來玩
mkdir python-orm
cd python-orm
pipenv install orator
pipenv install PyMySQL
建立本地資料庫
使用之前學過的 docker-compose
將此檔案命名成 docker-compose.yml
version: "3.6"
services:
mysql:
image: mysql:latest
environment:
MYSQL_DATABASE: 'ormdb'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'user1234'
MYSQL_ROOT_PASSWORD: 'root1234'
ports:
- "127.0.0.1:3306:3306"
phpmyadmin:
depends_on:
- mysql
image: phpmyadmin/phpmyadmin:latest
ports:
- "0.0.0.0:8888:80"
environment:
PMA_HOST: mysql
終端機打上
docker-compose up -d
打上以下簡短的程式碼
嘗試連線看看
from orator import DatabaseManager, Model
config = {
'mysql': {
'driver': 'mysql',
'host': '127.0.0.1',
'database': 'ormdb',
'user': 'user',
'password': 'user1234',
'prefix': ''
}
}
db = DatabaseManager(config)
Model.set_connection_resolver(db)